package jp.co.ledinge.syllabarygame;

import java.io.Serializable;

/**
 * 2点の単位
 */
public class Segment implements Serializable {
	private static final long serialVersionUID = -7373055291299836907L;
	/** DPmatchクラスで使用。重み付けで使用する */
	public static final int PEN_DOWN = 0;
	/** DPmatchクラスで使用。重み付けで使用する */
	public static final int PEN_UP = 1;
	/** 2点間の長さ */
	public int length;
	public int state;
	/** このセグメントの1点目 */
	public Point mPoint0;
	/** このセグメントの2点目 */
	public Point mPoint1;
	/** このセグメントの向き */
	public int direct;
	
	/**
	 * 3点間の計算用のみに使用されるユーティリティ的なコンストラクタ
	 * @param point0
	 * @param point1
	 */
	public Segment(Point point0, Point point1) {
		mPoint0 = point0;
		mPoint1 = point1;
		// 3点間の角度計算様なので、特にlengthやdirectが必要ない
	}
	public Segment(Point point0, Point point1, int state) {
		mPoint0 = point0;
		mPoint1 = point1;
		this.state = state;
		this.length = calcLength(point0, point1);
		// unifyShortSegmentでlengthとdirectは設定する
	}
	/**
	 * Ｙ                <br>
	 * ↑                 <br>
	 * │          Ｑ     <br>
	 * │        ／       <br>
	 * │      ／θ        <br>
	 * │    Ｃ────Ｐ      <br>
	 * │                 <br>
	 * Ｏ────────→Ｘ      <br>
	 *  P : mPoint0                    <br>
	 *  C : mPoint1(dictSeg.mPoint0)   <br>
	 *  Q : dictSeg.mPoint1            <br>
	 * 多分これでいいと思うけどテストが必要
	 * @param dictSeg
	 * @return θ
	 */
	public int calcDiffDirect(Segment dictSeg) {
//		double d1x = mPoint0.x - dictSeg.mPoint0.x;
//		double d1y = mPoint0.y - dictSeg.mPoint0.y;
//		double d2x = dictSeg.mPoint1.x - mPoint1.x;
//		double d2y = dictSeg.mPoint1.y - mPoint1.y;
//		double numerator = (d1x * d1y) + (d2x * d2y);
//		double denominator = Math.sqrt(Math.pow(d1x, 2) + Math.pow(d1y, 2)) * Math.sqrt(Math.pow(d2x, 2) + Math.sqrt(Math.pow(d2x, 2)));
//		double theta = Math.acos(numerator / denominator);
//		theta = (theta / Math.PI) * 180.0; // 角度に変換
//		int deg= (int) Math.floor(theta);
//		if ((theta - deg) >= 0.5) /*小数点を四捨五入*/
//		      deg++;
//		return Math.abs(deg);
		int direct1 = calcDirect(mPoint0, mPoint1);
		int direct2 = calcDirect(dictSeg.mPoint0, dictSeg.mPoint1);
		return (int) Math.abs(direct1 - direct2);
		
		
	}

	public static int calcLength(Point point, Point point2) {
	        final int dx = Math.abs(point.x - point2.x);
	        final int dy = Math.abs(point.y - point2.y);
	        return (int) Math.floor(Math.sqrt (dx*dx + dy*dy)) ;
	}
	/**
	 * 2点間の角度を求める
	 * @param point
	 * @param point2
	 * @return
	 */
	public static int calcDirect(Point point, Point point2) {
        final int dx = point2.x - point.x;
        final int dy = point2.y - point.y;
		double theta = Math.atan2(dy, dx);
		theta = (theta / Math.PI) * 180.0; // 角度に変換
		int deg= (int) Math.floor(theta);
		if ((theta - deg) >= 0.5) /*小数点を四捨五入*/
		      deg++;
		return Math.abs(deg);
	}
	public boolean isPenDown() {
		if (state == PEN_DOWN) {
			return true;
		}
		return false;
	}
	@Override
	public String toString() {
		StringBuilder result = new StringBuilder();
		result.append("length = " + length);
		result.append(" mPoint0 = " + mPoint0.toString());
		result.append(" mPoint1 = " + mPoint1.toString());
		result.append(" state = " + state);
		return result.toString();
	}
}
